package repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import dados.Amostra;
import dados.Central;
import dados.Enfermeira;
import dados.Posto;

public class RepositorioPosto extends SentencasBD {

	public RepositorioPosto(ConexaoBD conexao) {
		super(conexao, 1, 1, 1, 2);
		
		this.cadastro[0] = "INSERT INTO tb_posto (id, nome, endereco, central, enfermeiras) VALUES (?, ?, ?, " +
		   "(SELECT REF(C) FROM tb_central C WHERE C.id =  ?), ";
		this.atualizacao[0] = "UPDATE tb_posto SET nome = ?, endereco = ?, central = " +
						"(SELECT REF(C) FROM tb_central C WHERE C.id =  ?), enfermeiras = ";
		this.consulta[0] = "SELECT * FROM tb_posto A WHERE A.id = ?";
		this.consulta[1] = "SELECT A.id, A.nome, A.endereco FROM tb_posto A";
		this.remocao[0] = "DELETE FROM tb_posto WHERE id = ?";
	}
	
	public void inserir(Posto p) throws SQLException{
		String enfermeiras = "tp_nt_enfermeira(";
		for(int i = 0; i < p.getEnfermeiras().size(); i++){
			Enfermeira ce = p.getEnfermeiras().get(i);
			enfermeiras += "(SELECT REF(C) FROM tb_enfermeira C WHERE C.id = " + ce.getId() + ")";
			if(i != p.getEnfermeiras().size()-1)
				enfermeiras += ",";
		}
		enfermeiras += ")";
		
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.cadastro[0] + enfermeiras + ")");
		ps.setInt(1, p.getId());
		ps.setString(2, p.getNome());
		ps.setString(3, p.getEndereco());
		ps.setInt(4, p.getCentral().getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void editar(Posto p) throws SQLException{
		String enfermeiras = "tp_nt_enfermeira(";
		for(int i = 0; i < p.getEnfermeiras().size(); i++){
			Enfermeira ce = p.getEnfermeiras().get(i);
			enfermeiras += "(SELECT REF(C) FROM tb_enfermeira C WHERE C.id = " + ce.getId() + ")";
			if(i != p.getEnfermeiras().size()-1)
				enfermeiras += ",";
		}
		enfermeiras += ")";
		
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.atualizacao[0] + enfermeiras + " WHERE id = ?");
		ps.setString(1, p.getNome());
		ps.setString(2, p.getEndereco());
		ps.setInt(3, p.getCentral().getId());
		ps.setInt(4, p.getId());
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	public void remover(int id) throws SQLException{
		Connection c = this.conexao.getConexao();
		PreparedStatement ps = c.prepareStatement(this.remocao[0]);
		ps.setInt(1, id);
		
		ps.executeUpdate();
		ps.close();
		c.close();
	}
	
	private List<Enfermeira> pegarEnfermeiras(int id) throws SQLException{
		String sql = "SELECT DEREF(ss.COLUMN_VALUE).id, DEREF(ss.COLUMN_VALUE).nome, " +
					"DEREF(ss.COLUMN_VALUE).rg, DEREF(ss.COLUMN_VALUE).cpf, DEREF(ss.COLUMN_VALUE).coren" +
					" FROM TABLE(SELECT C.enfermeiras FROM tb_posto C WHERE C.id = ?) ss";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Enfermeira temp = null;
		List<Enfermeira> ret = new ArrayList<Enfermeira>();
		while(set.next()){
			temp = new Enfermeira(set.getInt(1), set.getString(2), set.getLong(3), set.getLong(4), set.getLong(5));
			ret.add(temp);
		}
		return ret;
	}
	
	private Central pegarCentral(int id) throws SQLException{
		String sql = "SELECT DEREF(C.central).id, DEREF(C.central).numero_licenca, DEREF(C.central).nome," +
					 " DEREF(C.central).endereco FROM tb_posto C WHERE C.id = ?";
		PreparedStatement ps = conexao.getConexao().prepareStatement(sql);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Central ret = null;
		if(set.next())
			ret = new Central(set.getInt(1), set.getLong(2), set.getString(3), set.getString(4));
		
		return ret;
	}
	
	public Posto buscar(int id) throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[0]);
		ps.setInt(1, id);
		ResultSet set = ps.executeQuery();
		Posto temp = null;
		if(set.next()){			
			temp = new Posto(set.getInt(1), set.getString(2), set.getString(3)); 
			//System.out.println(">> passou");
			temp.setEnfermeiras(this.pegarEnfermeiras(id));
			//System.out.println(">> passou2");
			temp.setCentral(this.pegarCentral(id));
		}
		return temp;
	}
	
	public Iterator<Posto> iterator() throws SQLException{
		PreparedStatement ps = conexao.getConexao().prepareStatement(consulta[1]);
		ResultSet set = ps.executeQuery();
		List<Posto> all = new ArrayList<Posto>();
		while(set.next()){			
			all.add(new Posto(set.getInt(1), set.getString(2), set.getString(3)));
		}
		return all.iterator();
	}
	
	/*
	public static void main(String[] args) {
		ConexaoBD c;
		try {
			c = new ConexaoBD("oracle.jdbc.driver.OracleDriver",
					"jdbc:oracle:thin:@itapissuma.cin.ufpe.br:1521:dbdisc", 
					"g101if685_eq02", "equipe2gdi");
			System.out.println("passou daqui 1");
			RepositorioPosto r = new RepositorioPosto(c);
			Posto p = new Posto(753159, new Central(1456), "nomePosto1", "endPosto1");
			List<Enfermeira> enfs = new ArrayList<Enfermeira>();
			enfs.add(new Enfermeira(12125));
			p.setEnfermeiras(enfs);
			r.inserir(p);
			System.out.println("INSERIU");
			Posto teste = r.buscar(753159);
			System.out.println("- Enfermeiras do posto buscado:");
			for(Enfermeira e : teste.getEnfermeiras())
				System.out.println("  " + e.getNome() + "-" + e.getId());
			p.getEnfermeiras().add(new Enfermeira(12));
			System.out.println("MANDANDO ATUALIZAR");
			r.editar(p);
			teste = r.buscar(753159);
			System.out.println("- Enfermeiras do posto editado:");
			for(Enfermeira e : teste.getEnfermeiras())
				System.out.println("  " + e.getNome() + "-" + e.getId());
		} catch (ClassNotFoundException e) {
			System.out.println(">> erro1");
			e.printStackTrace();
		} catch (SQLException e) {
			System.out.println(">> erro2");
			e.printStackTrace();
		}
	}*/
}
